/*******************************************************************************
* file  : mem alloc cfg
* creat : apleilx
* data  : 2021/09/26
*******************************************************************************/
#include "multi_malloc.h"
#include "sys_init.h"
#include "os_obj.h"

/*******************************************************************************
* @brief  CCM LOCK.
*******************************************************************************/
uu16 mem_ram_lock(void)
{
	uu16 st;

	if (osOK == osMutexWait(os_obj.mid_malloc, ms_ticks(2000)))
		st = 0;
	else
		st = 1;

	return st;
}

/*******************************************************************************
* @brief   UNLOCK.
*******************************************************************************/
void mem_ram_unlock(void)
{
	osMutexRelease(os_obj.mid_malloc);
}

/*******************************************************************************
* @brief  创建内存池 SRAM.
*******************************************************************************/
#define SRAM_SIZE (64*1024UL)
#define SRAM_BLOCK_SIZE (32UL)
OBJ_ALIGN(256)
uu64 sram_map[SRAM_SIZE / 8] /*OBJ_SECTION(".sram")*/;			 // 内存池
uu16 sram_tab[SRAM_SIZE / SRAM_BLOCK_SIZE] /*OBJ_SECTION(".sram")*/; // 内存分配表
multi_malloc_info_type sram_info = {0};							 // 工作信息
uu16 sram_lock(void) { return 0; }								 // 申请互斥锁
void sram_unlock(void) {}										 // 释放互斥锁
multi_malloc_api_ref(mem_sram);									 // 接口引用声明
const multi_malloc_type mem_sram = {							 // 信息描述
	sram_map,
	sram_tab,
	SRAM_SIZE,
	SRAM_BLOCK_SIZE,
	SRAM_SIZE / SRAM_BLOCK_SIZE,
	mem_ram_lock,
	mem_ram_unlock,
	&sram_info,
	multi_malloc_api_name(mem_sram)};
multi_malloc_api_make(mem_sram); // 创建API接口

/*******************************************************************************
* @brief  创建内存池 CCM.
*******************************************************************************/
#define CCM_SIZE (32*1024)
#define CCM_BLOCK_SIZE (256)

#define ccm_map (uu64*)(0x10000000+32*1024) //[CCM_SIZE / 8] OBJ_SECTION(".ccm");				  // 内存池
uu16 ccm_tab[CCM_SIZE / CCM_BLOCK_SIZE] OBJ_SECTION(".sram"); // 内存分配表
multi_malloc_info_type ccm_info = {0};						  // 工作信息
uu16 ccm_lock(void) { return 0; }							  // 申请互斥锁
void ccm_unlock(void) {}									  // 释放互斥锁
multi_malloc_api_ref(mem_ccm);								  // 接口引用声明
const multi_malloc_type mem_ccm = {							  // 信息描述
	ccm_map,
	ccm_tab,
	CCM_SIZE,
	CCM_BLOCK_SIZE,
	CCM_SIZE / CCM_BLOCK_SIZE,
	mem_ram_lock,
	mem_ram_unlock,
	&ccm_info,
	multi_malloc_api_name(mem_ccm)};
multi_malloc_api_make(mem_ccm); // 创建API接口
